/*
 * Copyright (c) 2007 Aleksey Nikiforov
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of 'Aleksey Nikiforov' nor the names of other contributors 
 *   may be used to endorse or promote products derived from this software 
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.lex.util;

import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.jme.image.Image;
import com.jme.image.Texture;
import com.jme.image.Texture2D;
import com.jme.util.TextureKey;
import com.jme.util.TextureManager;

/**
 * This class helps loading multiple textures with the same properties.
 * 
 * @author lex
 *
 */
public class TextureLoader {

	private static final Logger log =
		Logger.getLogger(TextureLoader.class.getName());
	
	
	private Texture.MinificationFilter minFilter;
	private Texture.MagnificationFilter magFilter;
	private float anisoLevel;
	private boolean flipped;
	private Image.Format imageType;
	
	private TextureKey lookupKey;
	
	public TextureLoader() {
		this(Texture.MinificationFilter.BilinearNoMipMaps, 
				Texture.MagnificationFilter.NearestNeighbor,
				1.0f, true, Image.Format.GuessNoCompression);
	}
	
	public TextureLoader(Texture.MinificationFilter minFilter, Texture.MagnificationFilter magFilter,
			float anisoLevel, boolean flipped, Image.Format imageType)
	{
		this.minFilter = minFilter;
		this.magFilter = magFilter;
		this.anisoLevel = anisoLevel;
		this.flipped = flipped;
		this.imageType = imageType;
		
		lookupKey = new TextureKey(
				null,
				flipped,
				imageType);
	}
	
	public Texture getImageFromCache(URL file) {
		lookupKey.setLocation(file);
		lookupKey.resetHashCode();
		
		Texture texture = null;
		Texture cached = TextureManager.findCachedTexture(lookupKey);
		if (cached != null) {
			texture = new Texture2D();
			texture.setTextureKey(new TextureKey(file, flipped, imageType));
			texture.setImage(cached.getImage());
			texture.setMinificationFilter(minFilter);
			texture.setMagnificationFilter(magFilter);
			texture.setAnisotropicFilterPercent(anisoLevel);
			
			if (log.isLoggable(Level.FINE)) {
				log.log(Level.FINE,
						"Texture cache hit for {0}", file.getFile());
			}
		}
		
		return texture;
	}
	
	public Texture loadTexture(URL file, Image image) {
		TextureKey tkey = new TextureKey(
				file,
				flipped,
				imageType);
		
		Texture texture = TextureManager.loadTexture(null, tkey, image,
				minFilter,
				magFilter,
				anisoLevel);
		
		texture.setMinificationFilter(minFilter);
		texture.setMagnificationFilter(magFilter);
		texture.setAnisotropicFilterPercent(anisoLevel);
		
		return texture;
	}
	
	public Texture loadTexture(URL file) {
		Texture texture = TextureManager.loadTexture(file,
				minFilter, magFilter, imageType, anisoLevel, flipped);
		
		texture.setMinificationFilter(minFilter);
		texture.setMagnificationFilter(magFilter);
		texture.setAnisotropicFilterPercent(anisoLevel);
		
		return texture;
	}
	
}
